import request from '@/utils/request';
import { requestWrapper, randomInt, randomDate } from '@/utils/mock';

// 获取数据概览
export function getDataOverview(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/overview',
      method: 'get',
      params
    }),
    // 模拟数据
    {
      totalUsers: randomInt(1000, 2000),
      userGrowth: randomInt(100, 300),
      totalVisits: randomInt(400000, 500000),
      visitGrowth: randomInt(10000, 15000),
      totalOperations: randomInt(2000000, 3000000),
      operationGrowth: randomInt(-5000, 5000),
      conversionRate: (randomInt(300, 400) / 10).toFixed(1),
      conversionGrowth: (randomInt(-50, 50) / 10).toFixed(1)
    }
  );
}

// 获取用户分析数据
export function getUserActivity(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/user-activity',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      // 生成日期标签
      const today = new Date();
      const dayCount = params?.type === 'monthly' ? 12 : (params?.type === 'weekly' ? 8 : 30);
      const timeLabels = [];
      
      if (params?.type === 'monthly') {
        // 按月生成日期
        for (let i = dayCount - 1; i >= 0; i--) {
          const date = new Date(today);
          date.setMonth(date.getMonth() - i);
          const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
          timeLabels.push(formattedDate);
        }
      } else if (params?.type === 'weekly') {
        // 按周生成日期
        for (let i = dayCount - 1; i >= 0; i--) {
          const date = new Date(today);
          date.setDate(date.getDate() - i * 7);
          const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
          timeLabels.push(formattedDate);
        }
      } else {
        // 按天生成日期
        for (let i = dayCount - 1; i >= 0; i--) {
          const date = new Date(today);
          date.setDate(date.getDate() - i);
          const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
          timeLabels.push(formattedDate);
        }
      }
      
      // 生成活跃用户数据
      const activeUsers = timeLabels.map(() => randomInt(500, 1000));
      
      return {
        timeLabels,
        activeUsers
      };
    }
  );
}

// 获取趋势数据
export function getTrendsData(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/trends',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      // 生成日期标签
      const today = new Date();
      const dayCount = 30; // 默认30天数据
      const timeLabels = [];
      
      for (let i = dayCount - 1; i >= 0; i--) {
        const date = new Date(today);
        date.setDate(date.getDate() - i);
        const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
        timeLabels.push(formattedDate);
      }
      
      // 生成数据集
      const visits = timeLabels.map(() => randomInt(1000, 2000));
      const users = timeLabels.map(() => randomInt(200, 500));
      const operations = timeLabels.map(() => randomInt(5000, 7000));
      
      return {
        timeLabels,
        datasets: {
          visits,
          users,
          operations
        }
      };
    }
  );
}

// 获取访问时段分布
export function getAccessTimeDistribution(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/access-time',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      // 生成24小时标签
      const hours = [];
      for (let i = 0; i < 24; i++) {
        hours.push(`${String(i).padStart(2, '0')}:00`);
      }
      
      // 模拟不同时段的访问量
      let counts;
      
      if (params?.type === 'weekday') {
        // 工作日模式：早晚高峰
        counts = [
          randomInt(50, 150), // 0点
          randomInt(20, 100), // 1点
          randomInt(10, 80),  // 2点
          randomInt(10, 50),  // 3点
          randomInt(10, 50),  // 4点
          randomInt(30, 80),  // 5点
          randomInt(80, 150), // 6点
          randomInt(200, 300), // 7点
          randomInt(300, 400), // 8点
          randomInt(350, 450), // 9点
          randomInt(300, 400), // 10点
          randomInt(250, 350), // 11点
          randomInt(200, 300), // 12点
          randomInt(250, 350), // 13点
          randomInt(300, 400), // 14点
          randomInt(300, 400), // 15点
          randomInt(250, 350), // 16点
          randomInt(200, 300), // 17点
          randomInt(250, 350), // 18点
          randomInt(200, 300), // 19点
          randomInt(150, 250), // 20点
          randomInt(100, 200), // 21点
          randomInt(80, 150),  // 22点
          randomInt(50, 100)   // 23点
        ];
      } else if (params?.type === 'weekend') {
        // 周末模式：分布更均匀
        counts = [
          randomInt(100, 200), // 0点
          randomInt(80, 150),  // 1点
          randomInt(50, 100),  // 2点
          randomInt(30, 80),   // 3点
          randomInt(20, 50),   // 4点
          randomInt(30, 70),   // 5点
          randomInt(50, 100),  // 6点
          randomInt(100, 180), // 7点
          randomInt(150, 250), // 8点
          randomInt(200, 300), // 9点
          randomInt(250, 350), // 10点
          randomInt(300, 400), // 11点
          randomInt(300, 400), // 12点
          randomInt(300, 400), // 13点
          randomInt(300, 400), // 14点
          randomInt(250, 350), // 15点
          randomInt(200, 300), // 16点
          randomInt(200, 300), // 17点
          randomInt(200, 300), // 18点
          randomInt(200, 300), // 19点
          randomInt(180, 280), // 20点
          randomInt(150, 250), // 21点
          randomInt(100, 200), // 22点
          randomInt(80, 150)   // 23点
        ];
      } else {
        // 全部：混合模式
        counts = Array.from({ length: 24 }, (_, i) => {
          if (i >= 9 && i <= 17) { // 工作时间
            return randomInt(250, 400);
          } else if (i >= 18 && i <= 22) { // 晚上
            return randomInt(150, 300);
          } else { // 深夜/凌晨
            return randomInt(10, 150);
          }
        });
      }
      
      return {
        hours,
        counts
      };
    }
  );
}

// 获取用户分布数据
export function getUserDistribution(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/user-distribution',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      let labels, values, colors;
      
      if (params?.type === 'dept') {
        // 按部门分布
        labels = ['研发部', '市场部', '销售部', '财务部', '人力资源部', '客服部'];
        values = [
          randomInt(20, 50),
          randomInt(15, 40),
          randomInt(30, 60),
          randomInt(10, 25),
          randomInt(5, 15),
          randomInt(10, 30)
        ];
        colors = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C', '#909399', '#8E44AD'];
      } else {
        // 默认按角色分布
        labels = ['管理员', '普通用户', '访客', '其他'];
        values = [
          randomInt(5, 30),
          randomInt(100, 200),
          randomInt(50, 100),
          randomInt(10, 50)
        ];
        colors = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C'];
      }
      
      return {
        labels,
        values,
        colors
      };
    }
  );
}

// 获取用户排名
export function getUserRanking(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/user-ranking',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      const limit = params?.limit || 10;
      const userNames = [
        'admin', 'zhangsan', 'lisi', 'wangwu', 'zhaoliu',
        'qianqi', 'sunba', 'zhoujiu', 'wushi', 'zhengyi',
        'user1', 'user2', 'user3', 'user4', 'user5'
      ];
      
      // 根据类型生成不同的值
      const isActivity = !params?.type || params.type === 'activity';
      
      // 生成排名数据
      const data = Array.from({ length: Math.min(limit, userNames.length) }, (_, i) => {
        return {
          userId: i + 1,
          username: userNames[i],
          value: isActivity ? randomInt(500, 2000) : randomInt(1000, 5000)
        };
      });
      
      // 按值排序
      return data.sort((a, b) => b.value - a.value);
    }
  );
}

// 获取功能使用情况
export function getFeatureUsage(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/feature-usage',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      const limit = params?.limit || 5;
      const features = [
        '用户管理', '角色管理', '文件管理', '通知公告', '数据字典',
        '部门管理', '岗位管理', '系统监控', '定时任务', '日志管理'
      ];
      
      // 生成功能使用数据
      const data = Array.from({ length: Math.min(limit, features.length) }, (_, i) => {
        return {
          featureName: features[i],
          usageCount: randomInt(1000, 5000)
        };
      });
      
      // 按使用量排序
      return data.sort((a, b) => b.usageCount - a.usageCount);
    }
  );
}

// 获取系统性能指标
export function getSystemPerformance(params) {
  return requestWrapper(
    // 真实API请求
    () => request({
      url: '/analytics/system-performance',
      method: 'get',
      params
    }),
    // 模拟数据
    () => {
      // 根据时间范围生成不同的时间标签
      let timeLabels;
      const now = new Date();
      
      if (params?.timeRange === 'hour') {
        // 过去一小时，每5分钟一个点
        timeLabels = Array.from({ length: 12 }, (_, i) => {
          const d = new Date(now);
          d.setMinutes(d.getMinutes() - (11 - i) * 5);
          return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
        });
      } else if (params?.timeRange === 'week') {
        // 过去一周，每天一个点
        timeLabels = Array.from({ length: 7 }, (_, i) => {
          const d = new Date(now);
          d.setDate(d.getDate() - (6 - i));
          return `${d.getMonth() + 1}/${d.getDate()}`;
        });
      } else {
        // 默认过去一天，每小时一个点
        timeLabels = Array.from({ length: 24 }, (_, i) => {
          const d = new Date(now);
          d.setHours(d.getHours() - (23 - i));
          return `${String(d.getHours()).padStart(2, '0')}:00`;
        });
      }
      
      // 生成性能数据
      const cpuUsage = timeLabels.map(() => randomInt(20, 60));
      const memoryUsage = timeLabels.map(() => randomInt(40, 80));
      const networkIO = timeLabels.map(() => randomInt(50, 200));
      const diskIO = timeLabels.map(() => randomInt(30, 100));
      
      return {
        timeLabels,
        cpuUsage,
        memoryUsage,
        networkIO,
        diskIO
      };
    }
  );
} 